package com.flying.collection;

import com.flying.poly.Person;
import org.junit.Test;

import java.util.*;

/**
 * @author 刘鹏飞
 * @ClassName CollectionTest
 * @Date 2024/12/27 20:42
 * @Created by 刘鹏飞
 * @Description 测试Collection接口中方法的使用
 */
public class CollectionTest {

       /*
    *
    （1）add(E obj)：添加元素对象到当前集合中
    （2）addAll(Collection other)：添加other集合中的所有元素对象到当前集合中，即this = this ∪ other

    注意：add和addAll的区别
    */

    @Test
    public void test1(){

        Collection  col=new ArrayList<>();

//        （1）add(E obj)：添加元素对象到当前集合中
        col.add("Hello");
        col.add(11);   // 自动装箱
        col.add(new Person());
//        col.add("百里守约");

         // （2）addAll(Collection other)：添加other集合中的所有元素对象到当前集合中，即this = this ∪ other
        System.out.println("==================addAll=====================");
        Collection<String> col2 =new ArrayList<>();
        System.out.println("col2 "+Arrays.toString(col2.toArray()));

        col2.addAll(col);
        System.out.println("col2 "+Arrays.toString(col2.toArray()));


    }



    /*
    *
    （3）int size()：获取当前集合中实际存储的元素个数
    （4）boolean isEmpty()：判断当前集合是否为空集合
    （5）boolean contains(Object obj)：判断当前集合中是否存在一个与obj对象equals返回true的元素
    （6）boolean containsAll(Collection coll)：判断coll集合中的元素是否在当前集合中都存在。即coll集合是否是当前集合的“子集”
    （7）boolean equals(Object obj)：判断当前集合与obj是否相等
    */


    @Test
    public void test2(){
        Collection  col=new ArrayList<>();
        col.add("Hello");
        col.add(11);   // 自动装箱
        col.add(new Person());



        // （3）int size()：获取当前集合中实际存储的元素个数
        System.out.println(col.size());

        // （4）boolean isEmpty()：判断当前集合是否为空集合
        System.out.println(col.isEmpty());

        // （5）boolean contains(Object obj)：判断当前集合中是否存在一个与obj对象equals返回true的元素\\
        //  contains(Object obj)  底层使用的是 ：  o.equals(es[i]) 比较的是内容
        //  使用自定义类的对象时，需要类重写 equals()方法
        System.out.println(col.contains("Hello"));                 // true
        System.out.println(col.contains(new String("Hello")));  // 源码中使用的equals()


        // （6）boolean containsAll(Collection coll)：判断coll集合中的元素是否在当前集合中都存在。即coll集合是否是当前集合的“子集”
        Collection col1 = new ArrayList<>();
        col1.add("程咬金");
        col1.add("貂蝉");
        col1.add("百里守约");
        col1.add("马可波罗");

        System.out.println(col1.containsAll(col));

        col1.addAll(col);

        System.out.println(col1.containsAll(col));

        // （7）boolean equals(Object obj)：判断当前集合与obj是否相等
        System.out.println(col1.equals(col1));

    }

        /*
    *（8）void clear()：清空集合元素
     （9） boolean remove(Object obj) ：从当前集合中删除第一个找到的与obj对象equals返回true的元素。
     （10）boolean removeAll(Collection coll)：从当前集合中删除所有与coll集合中相同的元素。即this = this - this ∩ coll
     （11）boolean retainAll(Collection coll)：从当前集合中删除两个集合中不同的元素，使得当前集合仅保留与coll集合中的元素相同的元素，即当前集合中仅保留两个集合的交集，即this  = this ∩ coll；
    */



    @Test
    public void test3(){
        Collection col1 = new ArrayList<>();
        col1.add("程咬金");
        col1.add("貂蝉");
        col1.add("百里守约");
        col1.add("马可波罗");


//        System.out.println(Arrays.toString(col1.toArray()));
//
//
//        // （9） boolean remove(Object obj) ：从当前集合中删除第一个找到的与obj对象equals返回true的元素。
//        System.out.println("=====================boolean remove(Object obj)==============================");
//
//        boolean remove = col1.remove("百里守约");
//        System.out.println(remove);
//
//        for (Object o : col1) {
//            System.out.println("o = " + o);
//        }
//
//        // （8）void clear()：清空集合元素
////        col1.clear();   // 内部遍历容器,将容器元素置为空;     为什么不将使用size=0，覆盖原有的元素，原因防止内存的泄漏
//
//
//        System.out.println("==========================clear()==============================");
//
//        for (Object o : col1) {
//            System.out.println("o = " + o);
//        }

        System.out.println("==========================boolean removeAll(Collection coll)==============================");

        // （10）boolean removeAll(Collection coll)：从当前集合中删除所有与coll集合中相同的元素。即this = this - this ∩ coll
        // 求差集

        Collection col2 = new ArrayList<>();
        col2.add("程咬金");
        col2.add("貂蝉");
        col2.add("百里守约");


//        boolean b = col1.removeAll(col2);
//        for (Object o : col1) {
//            System.out.println("o = " + o);
//        }


        // （11）boolean retainAll(Collection coll)：从当前集合中删除两个集合中不同的元素，使得当前集合仅保留与coll集合中的元素相同的元素，即当前集合中仅保留两个集合的交集，即this  = this ∩ coll；
        // 求交集
        boolean b1 = col1.retainAll(col2);

        for (Object o : col1) {
            System.out.println("o = " + o);
        }




    }

/*        *（12）Object[] toArray()：返回包含当前集合中所有元素的数组
     （13）hashCode()：获取集合对象的哈希值
     （14）iterator()：返回迭代器对象，用于集合遍历*/

    @Test
    public void test4(){
        Collection col1 = new ArrayList<>();
        col1.add("程咬金");
        col1.add("貂蝉");
        col1.add("百里守约");
        col1.add("马可波罗");

        Object[] array = col1.toArray();
        System.out.println(Arrays.toString(array));

        int i = col1.hashCode();
        System.out.println("i = " + i);


        // TODO:  迭代器的使用 ???
        Iterator iterator = col1.iterator();





    }


    /*
    *  集合 --> 数组： toArray()
       数组 --> 集合： Arrays.asList()
    */
    @Test
    public void test5(){
        String[] arr = {"AA", "BB", "CC", "DD", "EE"};

        Collection list = Arrays.asList(arr);

    }


    @Test
    public void test6(){

        Integer[] arr = new Integer[]{1,2,3};

        List<Integer> list = Arrays.asList(arr);
        System.out.println(list.size());
        System.out.println(list);


        int[] arr1 = {1, 2, 3};
        List<int[]> list1 = Arrays.asList(arr1);
        System.out.println(list1.size());
        System.out.println(list1);

    }

}
